
package Interfaz;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.io.File;
import java.io.InputStream;
import java.net.URISyntaxException;
import java.util.Queue;

import javax.swing.ImageIcon;
import javax.swing.JLabel;

import Coleccionables.*;
import Juego.Civil;
import Juego.Juego;
import Juego.Militar;
import Juego.Posicion;
import Objetos.*;
import Premios.*;
import Terrenos.*;

public class Metodos {
	
	private static Metodos single=new Metodos();
	
	private Graphics2D grafico;
	private int weight;
	private int height;
	private Juego juego;
	private JLabel combustible;
	private JLabel puntaje;
	private JLabel balas;

	private Metodos(){
		
	}
	
	public static synchronized Metodos get() {
		return single;
	}	
	
	public void cargarNivel(){

				
			juego=new Juego("/Mapas/mapa.txt");
		
		SpriteStore.get().putSprite("Imagenes/sand.png",Arena.class);
		SpriteStore.get().putSprite("Imagenes/mega up.gif",Militar.class);	
		SpriteStore.get().putSprite("Imagenes/black.png",Color.class);
		SpriteStore.get().putSprite("Imagenes/stone.png",Concreto.class);
		SpriteStore.get().putSprite("Imagenes/water.png",Agua.class);
		SpriteStore.get().putSprite("Imagenes/box.png",Caja.class);
		SpriteStore.get().putSprite("Imagenes/fire.GIF",Fuego.class);
		SpriteStore.get().putSprite("Imagenes/street.png",Asfalto.class);
		SpriteStore.get().putSprite("Imagenes/plant.png",Planta.class);
		SpriteStore.get().putSprite("Imagenes/bullets.png",Balas.class);
		SpriteStore.get().putSprite("Imagenes/points.png",Puntos.class);
		SpriteStore.get().putSprite("Imagenes/gas.png",Nafta.class);
		SpriteStore.get().putSprite("Imagenes/cone.png",Cono.class);
		SpriteStore.get().putSprite("Imagenes/baliza.gif",Baliza.class);
		SpriteStore.get().putSprite("Imagenes/wall.png",Pared.class);
		combustible.setText(""+juego.Combustible());
		balas.setText(""+juego.balasRobot());
		puntaje.setText(""+juego.getPuntaje());
		paint();
	}
	
	public synchronized void avanzar(){
		Posicion p1=juego.getPosicionRobot();		
		if(juego.avanzar()){
			try{
				switch(p1.getMira()){
			
				case 'n' :{				
						for(int i=height; i>0; i--){
							if(i%15==0){
							paintSinRobot();
							SpriteStore.get().getSprite(juego.getRobot()).draw(grafico, p1.getX()*weight, p1.getY()*height+i);							
							Thread.sleep(100);
							}
						}
					break;}
		
				case 'o' :{ 
						for(int i=weight; i>0; i--){
							if(i%15==0){
								paintSinRobot();
								SpriteStore.get().getSprite(juego.getRobot()).draw(grafico, p1.getX()*weight+i, p1.getY()*height);
								Thread.sleep(100);
							}
						}
						break;}
		
				case 's' :{ 
						for(int i=height; i>0; i--){
							if(i%15==0){
							paintSinRobot();
							SpriteStore.get().getSprite(juego.getRobot()).draw(grafico, p1.getX()*weight, p1.getY()*height-i);
							Thread.sleep(100);		
							}
						}
						break;}
				case 'e' :{ 
						for(int i=weight; i>0; i--){
							if(i%15==0){
							paintSinRobot();
							SpriteStore.get().getSprite(juego.getRobot()).draw(grafico, p1.getX()*weight-i, p1.getY()*height);
							Thread.sleep(100);
							}
						}
						break;}
				}
			}
			catch (InterruptedException e) {				                  
				 e.printStackTrace();
			}
			combustible.setText(""+juego.Combustible());
			paint();
		}		
	}
	
	public void girarIzquierda(){
		switch(juego.getPosicionRobot().getMira()){
			case 'n': SpriteStore.get().putSprite("Imagenes/mega left.gif",Militar.class);
				break;
			case 'o': SpriteStore.get().putSprite("Imagenes/mega down.gif",Militar.class);
			break;
			case 's': SpriteStore.get().putSprite("Imagenes/mega right.gif",Militar.class);
			break;
			case 'e': SpriteStore.get().putSprite("Imagenes/mega up.gif",Militar.class);
			break;
		}
		juego.girarIzquierda();
		
		paint();
	}
	public void girarDerecha(){
		switch(juego.getPosicionRobot().getMira()){
			case 'n': SpriteStore.get().putSprite("Imagenes/mega right.gif",Militar.class);
			break;
			case 'o': SpriteStore.get().putSprite("Imagenes/mega up.gif",Militar.class);
			break;
			case 's': SpriteStore.get().putSprite("Imagenes/mega left.gif",Militar.class);
			break;
			case 'e': SpriteStore.get().putSprite("Imagenes/mega down.gif",Militar.class);
			break;
			}
		juego.girarDerecha();
		
		paint();
	}
	
	public void setGraphics(Graphics g){
		grafico=(Graphics2D)g;
	}
	
	public void paint(){
		int x=0;
		int y=0;
		for(int i =0;i<10;i++){
			x=weight*i;
			for(int j=0;j<10;j++){
				y=height*j;
				Queue<Object> elem=juego.elements(i, j);
				while(!elem.isEmpty())
				SpriteStore.get().getSprite(elem.poll()).draw(grafico, x, y);
			}
		}
		SpriteStore.get().getSprite(juego.getRobot()).draw(grafico, juego.getPosicionRobot().getX()*weight, juego.getPosicionRobot().getY()*height);
		combustible.setText(""+juego.Combustible());
		balas.setText(""+juego.balasRobot());
		puntaje.setText(""+juego.getPuntaje());
	}
	public void paintSinRobot(){
		int x=0;
		int y=0;
		for(int i =0;i<10;i++){
			x=weight*i;
			for(int j=0;j<10;j++){
				y=height*j;
				Queue<Object> elem=juego.elements(i, j);
				while(!elem.isEmpty())
				SpriteStore.get().getSprite(elem.poll()).draw(grafico, x, y);
			}
		}
		combustible.setText(""+juego.Combustible());
		balas.setText(""+juego.balasRobot());
		puntaje.setText(""+juego.getPuntaje());
	}
	
	public void setDimension(int w,int h){
		weight=w;
		height=h;
	}
	
	public void setLabels(JLabel c,JLabel p, JLabel b){
		combustible=c;
		puntaje=p;
		balas=b;
	}
	public boolean Terminamos(){
		return juego.terminamos();
	}
	public boolean ganamos(){
		return juego.ganamos();
	}
	public int Combustible(){
		return juego.Combustible();
	}
	public void recolectar(){
		juego.recolectar();
		paint();
	}
	public void disparar(){
	if(juego.balasRobot()>0){
		int dist=juego.distanciaDisparo();
		int x=juego.getPosicionRobot().getX();
		int y=juego.getPosicionRobot().getY();
		dist--;
		switch(juego.getPosicionRobot().getMira()){
		
			case 'n' : {
				Image imagen = new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Fire-Up.gif")).getImage();
				for(int i=1;i<height*dist;i++){
						if(i%25==0){
						Queue<Object> elem=juego.elements(x, y-(i/height));
						while(!elem.isEmpty())
							SpriteStore.get().getSprite(elem.poll()).draw(grafico, x*weight, (y-(i/height))*height);
						 							
						grafico.drawImage(imagen,x*weight,(y*height)-i,weight/2,height/2,null);	
						SpriteStore.get().getSprite(juego.getRobot()).draw(grafico, juego.getPosicionRobot().getX()*weight, juego.getPosicionRobot().getY()*height);
						try {
							Thread.sleep(100);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
				paint();
			};
				break;
		
			case 'o' : {
				Image imagen = new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Fire-Left.gif")).getImage();
				for(int i=1;i<weight*dist;i++){
						if(i%25==0){
						Queue<Object> elem=juego.elements(x-(i/weight), y);
						while(!elem.isEmpty())
							SpriteStore.get().getSprite(elem.poll()).draw(grafico, (x-(i/weight))*weight, y*height);
						 							
						grafico.drawImage(imagen,(x*weight)-i,(y*height),weight/2,height/2,null);	
						SpriteStore.get().getSprite(juego.getRobot()).draw(grafico, juego.getPosicionRobot().getX()*weight, juego.getPosicionRobot().getY()*height);
						try {
							Thread.sleep(100);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
				paint();
			};
			break;
		
			case 's' : {
				Image imagen = new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Fire-Down.gif")).getImage();
				for(int i=1;i<height*dist;i++){
						if(i%25==0){
						Queue<Object> elem=juego.elements(x, y+(i/height));
						while(!elem.isEmpty())
							SpriteStore.get().getSprite(elem.poll()).draw(grafico, x*weight, (y+(i/height))*height);
						 							
						grafico.drawImage(imagen,x*weight,(y*height)+i,weight/2,height/2,null);	
						SpriteStore.get().getSprite(juego.getRobot()).draw(grafico, juego.getPosicionRobot().getX()*weight, juego.getPosicionRobot().getY()*height);
						try {
							Thread.sleep(100);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
				paint();
			};
			break;
		
			case 'e' : {
				Image imagen = new ImageIcon(getClass().getClassLoader().getResource("Imagenes/Fire-Right.gif")).getImage();
				for(int i=1;i<weight*dist;i++){
						if(i%25==0){
						Queue<Object> elem=juego.elements(x+(i/weight), y);
						while(!elem.isEmpty())
							SpriteStore.get().getSprite(elem.poll()).draw(grafico, (x+(i/weight))*weight, y*height);
						 							
						grafico.drawImage(imagen,(x*weight)+i,(y*height),weight/2,height/2,null);	
						SpriteStore.get().getSprite(juego.getRobot()).draw(grafico, juego.getPosicionRobot().getX()*weight, juego.getPosicionRobot().getY()*height);
						try {
							Thread.sleep(100);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
				paint();
			};
			break;	
		}
		juego.disparar();
		paint();
		}
	}
	public void descargar(){
		juego.descargar();
		paint();
	}

}
